\subsection{Servlet}
	
	Comme expliqué précédement, notre serveur est conçu grâce aux \glspl{servlet}.
	Après avoir décrit leur fonctionnement, nous allons montrer dans cette partie
	comment elles ont été utilisées.
		
	\subsubsection{En pratique}
		Au lancement du serveur, la classe ContextListener est invoquée lorsque l'objet
		ServletContext est crée. Sa méthode contextInitialized(ServletContextEvent event) sera alors appelée, 
		permettant ainsi de définir des objets communs à toutes les
		\glspl{servlet}, tels qu'un accesseur à la base de données, ou le tableau qui
		contenant les utilisateurs connectés. Les requêtes font appels à la fonction
		post des \glspl{servlet}. Le flux entrant étant de type \gls{json}, il faut
		désérialiser le flux dans un objet correspondant. Exemple l'utilisateur envoie son nom d'utilisateur ansi que son mot de passe crypté
		dans un tableau, sérialisé en \gls{json}.
		Pour pouvoir récupérer les informations, nous procédons comme suit: 
		
		\begin{verbatim}
			BufferedReader req = 
				    new BufferedReader(new InputStreamReader(request.getInputStream()));
			OutputStreamWriter writer = 
				    new OutputStreamWriter(response.getOutputStream());
			String message = req.readLine();
			
			if (message != null) {
				  response.setContentType("text/html");
				
				   // désérialisation des infos de l'utilisateur dans une arraylist 
				  JSONDeserializer<ArrayList<String>> jsonDeserializer = 
					    new JSONDeserializer<ArrayList<String>>();
				  ArrayList<String> identifiers;
				  identifiers = jsonDeserializer.deserialize(message);
				
				  username = identifiers.get(0);
				  password = identifiers.get(1);
				  
			  ...}
		\end{verbatim}
		
		
	\subsubsection{La sécurité}
	
		Ce serveur de jeu étant hebergé sur internet et contenant des informations
		sensibles d'utilisateurs, tels que des mots de passes, il était crucial
		d'instaurer des règles de sécurité et de cryptage. 
		
		En effet, lors des inscriptions ou connexion au serveur pour le mode
		multijoueur, les mots de passes sont tout d'abord cryptés côté client et
		ensuite encapsulés dans un flux \gls{json}, pour être envoyés au serveur. Il
		stockera ainsi la chaîne de caractères extraite de l'objet déserialisé. De cette
		manière à aucun moment les données confidentielles ne transiteront en clair.
		
		De plus un mécanisme semblable aux sessions est en place. Dans la
		confirmation de connexion ou d'inscription, une clé d'utilisateur est générée. Elle correspond en
		réalité à l'identifiant de session envoyé par le serveur. Une fois associée
		au nom d'utilisateur correspondant, le tout est ajoûté dans le tableau
		d'utilisateurs connectés.
		Cette clé d'utilisateur est ensuite nécessaire pour contacter les \glspl{servlet}
		suivantes. Si cet identifiant n'est pas envoyé ou n'est pas présent dans le tableau des
		utilisateurs connectés, il sera alors impossible à l'utilisateur d'accéder aux
		ressources du serveur.
		
\subsection{BDD}

	La base de données du serveur n'est pas très complexe. En effet, elle ne fait
	qu'accueillir les couples (nom d'utilisateur, mot de passe) des utilisateurs dans
	la table Users. 
	Pour son accès, chaque \gls{servlet} peut récupérer un objet de type
	Connection, instancié à l'initialisation du serveur. Il permettra à son tour
	de récuperer un objet de type Statement. L'application va l'employer pour
	transmettre des instructions à la base de données.
	Exemple d'insertion: 
		
	\begin{verbatim}
	Connection connection = 
	  DriverManager.getConnection("jdbc:mysql://127.0.0.1/Bomberklob", "user","user");
	Statement theStatement = connection.createStatement();
	theStatement.execute(
		     "INSERT into Users VALUES ('"+ username +"','"+password+"')");
	\end{verbatim}
	
	Bien évidemment cette adresse est remplacée par une variable, elle aussi
	présente dans le ContextListener, contenant la véritable adresse de la base de
	données.
	
	
	
	
